/*
 * @Author: xushuhao
 * @Email: xshmouse@163.com
 * @Date: 2020-04-22 10:01:52
 * @Last Modified by: xushuhao
 * @Last Modified time: 2020-07-28 08:49:08
 * @Description: HTTP工具包
 * 详细说明： https://github.com/flutterchina/dio/blob/master/README-ZH.md
 */

import 'package:dio/dio.dart';
import 'package:flutter_code_framework/utils/global.dart';

/// 初始化dio
Dio initDio() {
  BaseOptions _baseOptions = BaseOptions(
    //connectTimeout: 60000, // 连接服务器超时时间，单位是毫秒.
    //receiveTimeout: 10000, // 响应流上前后两次接受到数据的间隔，单位为毫秒, 这并不是接收数据的总时限.
     // baseUrl: "http://192.168.0.238:50003/Tapp",
    baseUrl: "http://ck.wiscoor.com/Tapp",
    // baseUrl:"http://192.168.0.102/Tapp",
  );

  Dio dio = Dio(_baseOptions);

  //抓包配置，需要时开启；否则屏蔽即可；
  // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
  //     (HttpClient client) {
  //   client.findProxy = (uri) {
  //     return "PROXY 127.0.0.1:8888";
  //   };
  // };

  dio.interceptors.add(
    InterceptorsWrapper(
        //在请求被发送之前做一些事情
        onRequest: (RequestOptions options) async {
      if (G.user.data != null) {
        //统一添加登录验证信息
        options.queryParameters['userId'] = G.user.data.userId;
        options.queryParameters['validateCode'] = G.user.data.validateCode;
      }

      return options;
      // 如果你想完成请求并返回一些自定义数据，可以返回一个`Response`对象或返回`dio.resolve(data)`。
      // 这样请求将会被终止，上层then会被调用，then中返回的数据将是你的自定义数据data.
      //
      // 如果你想终止请求并触发一个错误,你可以返回一个`DioError`对象，或返回`dio.reject(errMsg)`，
      // 这样请求将被中止并触发异常，上层catchError会被调用。
    },
        //在返回响应数据之前做一些预处理
        onResponse: (Response response) async {
      // 判断是否超时返回登录页面
      //

      // 在返回响应数据之前做一些预处理
      if (response.data['isOk'] == false) {
        //code != 0
        await G.toast(response.data['errMsg']); //result
        if (response.data['errMsg'] == '您尚未登录') {
          G.pushNamed('/login');
        }
        response.data = null;
      }
      return response;
    },
        //当请求失败时做一些预处理
        onError: (DioError e) async {
      G.toast(e.message);
      // 当请求失败时做一些预处理
      return e; //continue
    }),
  );

  return dio;
}
